package com.cskaoyan.java._1handle._2throws;

/**
 * throws关键字,抛出的意思(注意这个单词后面加了一个"s")
 * 该关键字使用在方法中的声明中
 * 其语法是：
 * [方法的修饰符列表] 返回值类型 方法名(形参列表) throws 异常列表{
 *   // 方法头
 * }
 *      解释:
 *          1."异常列表"写的是抛出异常的类型,就是写类名,可以写多个,用","隔开
 *          2.（最重要的）该关键字用在方法的声明中
 *              仅表示该方法抛出异常的可能性。具体是否会抛出异常，要看具体的代码执行结果。
 *          3.对于运行时异常,如果不进行try...catch,它自身就会向上抛出
 *              所以对于运行时异常,不需要使用throws关键字表示它抛出的可能性(因为只要不try..catch它自己就会抛出来)
 *              我们只需要使用该语法去手动处理
 *                  手动向上抛出编译时异常，表示该方法具有抛出一个编译时异常的可能性。
 *              于是对于方法中可能产生的编译时异常,就有了两种处理方式:
 *                  1.用try...catch直接就地处理
 *                  2.用throws关键字表示抛出它(如果它产生的话)
 *
 * 使用throws关键字处理方法中可能抛出的编译时异常,表示该方法具有抛出一个编译时异常的可能性
 *      不管这个编译时异常到底会不会抛出
 *      方法的调用者都必须强制处理这个编译时异常,处理的方式:
 *          1.再次throws
 *          2.try..catch
 *
 *  throws关键字后面跟的异常列表中出现的异常类型，
 *  如果具有父子关系，那么编译器只会强制要求处理父类（针对编译时异常）。所以列表中尽量写同级别的异常类型，如果有父类类型，子类就全都不要写了。
 *
 * @since 16:07
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo implements Cloneable {
    public static void main(String[] args) {
        System.out.println("66666666666666666666666");
        test();

        try {
            new Demo().test2();
        }
        // catch (Exception e) {
        //     e.printStackTrace();
        // }
        catch (CloneNotSupportedException e) {
            e.printStackTrace();
            System.out.println("手动处理了克隆异常!");
        }
        System.out.println("8888888888888888888");
    }

    // 这样的方法声明意义不大,不建议写
    public static void test() throws NullPointerException {
    }

    // 该方法的声明就告诉调用者,该方法可能抛出一个编译时异常CloneNotSupportedException
    public void test2() throws CloneNotSupportedException {
        clone();
    }

}
